package com.miyu.common.utils.bookPage;

import com.alibaba.fastjson.JSONObject;
import com.miyu.common.pojo.book.BookPagePJ;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.List;

/**
 * 书页jx
 * 公共解析入口
 * 解析+缓存数据
 * 不做数据持久化
 *
 * @author miyu
 * @date 2022/07/12
 */
public class BookPageJx implements PageProcessor {

    /**
     * 爬虫配置信息设置 有条件动态配置
     */
    private Site site = new Site()
            /*设置编码*/
            .setCharset("utf-8")
            /*设置抓取间隔*/
            .setSleepTime(1)
            /*设置超时时间*/
            .setTimeOut(10000)
            /* 设置重试时间*/
            .setRetrySleepTime(300)
            /*设置重试次数*/
            .setRetryTimes(3);

    @Override
    public Site getSite() {
        return this.site;
    }

    /**
     * 解析page公共方法 不同的参数解析不同
     *
     * @param jo
     * @return
     */
    public static JSONObject BookPageJX(BookPagePJ jo) {
        //增加解析过程中参数加入
          JSONObject filter = new JSONObject();
          Request request = new Request();
          request.setUrl(jo.getUrl());
//        request.putExtra("bookRule", jo.getRule());//对应解析不同的规则
//        request.putExtra("cond", jo.getCond());//key 以及解析顺序
//        request.putExtra("param", jo.getParam());//附加参数传入
        /*缓存key值*/
          request.putExtra("key", jo.getKey());
          request.putExtra("param",jo);

        Spider.create(new BookPageJx()).addRequest(request)
                //最后数据人缓存
                .addPipeline(new SaveCacheData())
                .thread(50)
                .run();
        return null;
    }

    /**
     * 变量值为固定配置不可改变值以及附加属性
     * @param page
     */
    @SneakyThrows
    @Override
    public void process(Page page) {
        /*当前url连接*/
        String url = page.getRequest().getUrl();
        /*缓存key*/
        String key = page.getRequest().getExtra("key");
        /*参数*/
        BookPagePJ pagePJ= page.getRequest().getExtra("param");
        List<String> cond = pagePJ.getCond();
        //解析临时数据
        JSONObject temp = pagePJ.getTemp();
        if(StringUtils.isNotBlank(pagePJ.getRuleStr())){
           /* 单个执行解析 如有此此参数 不再执行以下执行*/
            temp.put(key,JXPageUtils.JXPageRuleByCheckRule(page,pagePJ.getRuleStr()));
            page.putField("key",key);
            page.putField("data",temp);
        }else{
            if(cond.size()>0){
                String item = cond.get(0);
                switch (item){
                    /*首页搜索*/
                    case "bookSearch":
                        CommonBookJx.BookSearch(page);
                        break;
                        /*获取明细*/
                    case "bookDetail":
                        CommonBookJx.bookDetail(page);
                        break;
                        /*章节列表*/
                    case "bookChapter":
                        CommonBookJx.bookChapter(page);
                        break;
                        /*阅读文本*/
                    case"bookReader":
                        CommonBookJx.bookReader(page);
                        break;
                        /*书籍采集*/
                    case "collectBook":
                        CommonBookJx.collectBook(page);
                        break;
                        /*原始章节书籍下载*/
                    case "downloadBook":
                        CommonBookJx.downloadBook(page);
                        break;
                    default:
                        break;
                }
            }
        }
    }
}

